//
//  ProblemMS0502.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/26.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 面试题 05.02. 二进制数转字符串
 二进制数转字符串。给定一个介于0和1之间的实数（如0.72），类型为double，打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示，则打印“ERROR”。

 示例1:
      输入：0.625
      输出："0.101"
 示例2:
      输入：0.1
      输出："ERROR"
      提示：0.1无法被二进制准确表示
 提示：
    32位包括输出中的"0."这两位。
 */
@objcMembers class ProblemMS0502: NSObject {
    func solution() {
        print(printBin(0.625))
        print(printBin(0.1))
    }
    /*
     看别人的题解：通过num*2，然后取整就可以。
     1: 窗口一个字符串，str = "0."
     2: 每次让num*2, 把整数部分放入str中；
     3: 当str.length>32返回ERROR
     */
    func printBin(_ num: Double) -> String {
        if num == 0 {
            return "0"
        }
        
        var tNum = num
        var str = "0."
        while tNum != 0 {
            tNum *= 2
            
            if tNum >= 1 {
                str += "1"
                tNum -= 1
            } else {
                str += "0"
            }
        
            if str.count > 32 {
                return "ERROR"
            }
        }
        return str
    }
}
